# 相关库
from scipy import  stats
from statsmodels.graphics.tsaplots import plot_acf as ACF   #自相关图
from statsmodels.graphics.tsaplots import plot_pacf as PACF   #偏自相关图
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.tsa.arima.model import ARIMA
import statsmodels.api as sm  # 统计相关的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import arch  # 条件异方差模型相关的库
import seaborn as sns     #seaborn画图
sns.set(color_codes=True) #seaborn设置背景

#①导入数据
data=pd.read_excel('中芯国际股价数据.xlsx')
data.set_index('date', inplace=True) #设定日期为索引
r2=np.log(data['close'])-np.log(data['close'].shift(1)) #计算对数收益率
r2=r2.dropna()  #去除包含NaN的行

#②使用偏自相关函数ACF对对数收益率序列定阶
#ACF图定阶
fig = ACF(r2, lags = 30)   
plt.show()
#5
#信息准则AIC定阶
#print(sm.tsa.arma_order_select_ic(r2,max_ar=0,max_ma=30,ic='aic')['aic_min_order'])
#最大似然估计不收敛，无法通过AIC定阶

#③MA(5)建模

temp = np.array(r2) # 载入收益率序列
model =ARIMA(temp,order=(0, 0, 5))  
res = model.fit()  
print(res.summary())

plt.rcParams['font.sans-serif'] = ['simhei'] #字体为黑体
plt.rcParams['axes.unicode_minus'] = False #正常显示负号 
plt.figure(figsize=(10,4))
plt.plot(temp,'b',label='对数收益率')
plt.plot(res.fittedvalues, 'r',label='MA model')
plt.legend()
plt.show()

#④模型检验
delta = res.fittedvalues  - temp  # 残差
plt.figure(figsize=(10,6))
plt.plot(delta,'r',label=' residual error')
plt.legend(loc=0)
acf,q,p = sm.tsa.acf(delta,nlags=12,qstat=True)  ## 计算自相关系数 及p-value
out = np.c_[range(1,13), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])
output = output.set_index('lag')
print(output)
#通过白噪声检验

#⑤拟合优度
score = 1 - delta.var()/temp.var() #计算拟合优度
print(score)
#0.017，效果不佳
